package com.ahorresas.controllers;

import com.ahorresas.modelo.daos.PersonaDao;
import com.ahorresas.modelo.beans.PersonaBean;
import java.io.IOException;
import java.util.List;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

public class PersonaController extends HttpServlet {
    
    private final PersonaDao personaDao = new PersonaDao();
    private String identificacion;
    private String tipoDocumento;
    private String nombre;
    private String apellidoUno;
    private String apellidoDos;
    private String direccion;
    private String telefono;
    private String celular;
    private String correo;
    private int resultado;
    
    @Override
    protected void doGet(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        doPost(request, response);
    }

    @Override
    protected void doPost(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        
        /*Control del boton accionado desde la página JSP*/
        String accion = request.getParameter("accion");
        if(accion == null)
            accion = "";
        
        identificacion = request.getParameter("identificacion");
        tipoDocumento = request.getParameter("tipoDocumento");
        nombre = request.getParameter("nombre");
        apellidoUno = request.getParameter("apellidoUno");
        apellidoDos = request.getParameter("apellidoDos");
        direccion = request.getParameter("direccion");
        telefono = request.getParameter("telefono");
        celular = request.getParameter("celular");
        correo = request.getParameter("correo");
        
        PersonaBean persona = null;
        String validacion = "";
        resultado = 0;
        
        switch (accion) {
            case "consultar":
                validacion = obligatorios(false);
                if(validacion.length() > 0){
                    mantenerDatos(request);
                    request.setAttribute("msg", validacion);
                } else {
                    persona = personaDao.buscarPersona(identificacion);
                    if(persona != null){
                        llenarCampos(request, persona);
                        request.setAttribute("msg", "La persona fué encontrada con éxito");
                    }else{
                        request.setAttribute("msg", "La persona no pudo ser encontrada");
                    }
                }
                break;
            case "guardar":
                validacion = obligatorios(true);
                if(validacion.length() > 0){
                    mantenerDatos(request);
                    request.setAttribute("msg", validacion);
                } else {
                    persona = personaDao.buscarPersona(identificacion);
                    if(persona != null){
                        persona.setTipoDocumento(tipoDocumento);
                        persona.setNombre(nombre);
                        persona.setApellidoUno(apellidoUno);
                        persona.setApellidoDos(apellidoDos);
                        persona.setDireccion(direccion);
                        persona.setTelefono(telefono);
                        persona.setCelular(celular);
                        persona.setCorreo(correo);

                        resultado = personaDao.modificarPersona(persona);
                    } else {
                        persona = new PersonaBean();
                        persona.setIdentificacion(identificacion);
                        persona.setTipoDocumento(tipoDocumento);
                        persona.setNombre(nombre);
                        persona.setApellidoUno(apellidoUno);
                        persona.setApellidoDos(apellidoDos);
                        persona.setDireccion(direccion);
                        persona.setTelefono(telefono);
                        persona.setCelular(celular);
                        persona.setCorreo(correo);

                        resultado = personaDao.crearPersona(persona);
                    }
                    
                    if(resultado == 1){
                        llenarCampos(request, null);
                        request.setAttribute("msg", "La persona fué guardada con éxito.");
                    } else {
                        request.setAttribute("msg", "La persona no pudo ser guardada.");
                    }
                }
                break;
            case "eliminar":
                validacion = obligatorios(false);
                if(validacion.length() > 0){
                    mantenerDatos(request);
                    request.setAttribute("msg", validacion);
                } else {
                    resultado = personaDao.eliminarPersona(identificacion);
                    if(resultado == 1){
                        llenarCampos(request, null);
                        request.setAttribute("msg", "La persona fué eliminada con éxito");
                    } else {
                        request.setAttribute("msg", "La persona no pudo ser eliminada.");
                    }
                }
                break;
            case "listar":
                List<PersonaBean> listaPersonas = personaDao.listarPersonas();
                request.setAttribute("lista", listaPersonas);
                break;
        }
        
        request.getRequestDispatcher("./jsp/persona.jsp").forward(request, response);
    }
    
    public String obligatorios(boolean guardado){
        StringBuilder resultado = new StringBuilder();
        if(identificacion == null || identificacion.equals(""))
            resultado.append("El campo 'Documento' no debe estar vacío. <br>");
        else {
            try {
                Integer.valueOf(identificacion);
            } catch (NumberFormatException e) {
                resultado.append("El campo 'Documento' debe ser numérico. <br>");
            }
        }

        /* Si es guardado de datos valida los demás campos de lo contrario 
         * retorna la validación sobre el clave 
         */
        if(!guardado) return resultado.toString();
        
        if(tipoDocumento.equals("00"))
            resultado.append("Debe seleccionar una de las opciones de 'Tipo de documento'. <br>");
        if(nombre == null || nombre.equals(""))
            resultado.append("El campo 'Nombre' no debe estar vacío. <br>");
        if(apellidoUno == null || apellidoUno.equals(""))
            resultado.append("El campo 'Primer apellido' no debe estar vacío. <br>");
        if(direccion == null || direccion.equals(""))
            resultado.append("El campo 'Dirección' no debe estar vacío. <br>");
        if(telefono == null || telefono.equals(""))
            resultado.append("El campo 'Teléfono' no debe estar vacío. <br>");
        return resultado.toString();
    }
    
    public void llenarCampos(HttpServletRequest request, PersonaBean persona){
        request.setAttribute("identificacion", persona != null ? persona.getIdentificacion(): "");
        request.setAttribute("tipoDocumento", persona != null ? persona.getTipoDocumento() : "");
        request.setAttribute("nombre", persona != null ? persona.getNombre() : "");
        request.setAttribute("apellidoUno", persona != null ? persona.getApellidoUno() : "");
        request.setAttribute("apellidoDos", persona != null ? persona.getApellidoDos() : "");
        request.setAttribute("direccion", persona != null ? persona.getDireccion() : "");
        request.setAttribute("telefono", persona != null ? persona.getTelefono() : "");
        request.setAttribute("celular", persona != null ? persona.getCelular() : "");
        request.setAttribute("correo", persona != null ? persona.getCorreo() : "");
    }
    
    public void mantenerDatos(HttpServletRequest request){
        request.setAttribute("identificacion", identificacion != null ? identificacion : "");
        request.setAttribute("tipoDocumento", tipoDocumento != null ? tipoDocumento : "");
        request.setAttribute("nombre", nombre != null ? nombre : "");
        request.setAttribute("apellidoUno", apellidoUno != null ? apellidoUno : "");
        request.setAttribute("apellidoDos", apellidoDos != null ? apellidoDos : "");
        request.setAttribute("direccion", direccion != null ? direccion : "");
        request.setAttribute("telefono", telefono != null ? telefono : "");
        request.setAttribute("celular", celular != null ? celular : "");
        request.setAttribute("correo", correo != null ? correo : "");
    }
}
